#include <iostream>
#include "game.h"
#include "video.h"

using std::cerr; using std::endl;

Video* video = NULL;

/*---------------------------------

Video::Video( void )
Skapar videon

---------------------------------*/

Video::Video( void ) : screen(NULL), font(NULL) {
	delete video, video = this;

	if( SDL_Init( SDL_INIT_VIDEO ) == -1 ) {
		cerr << "Fatalt Fel (Video::Video): SDL_Init misslyckades: " << SDL_GetError() << endl;
		exit(1);
	}

	if( TTF_Init() == -1 ) {
		cerr << "Fatalt Fel (Video::Video): TTF_Init misslyckades: " << SDL_GetError() << endl;
		exit(1);
	}

	font = TTF_OpenFont( "arial.ttf", 28 );
	if( font == NULL ) {
		cerr << "Fatalt Fel (Video::Video): Kunde inte ladda arial.ttf" << endl;
		exit(1);
	}

	screen = SDL_SetVideoMode( 640, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF );
	if( screen == NULL ) {
		cerr << "Fatalt Fel (Video::Video): screen är NULL" << endl;
		exit(1);
	}

	SDL_WM_SetCaption( "Schack of DOOM", NULL );
}

/*---------------------------------

Video::~Video( void )
Destruktorn

---------------------------------*/

Video::~Video( void ) {
	SDL_FreeSurface( screen );
	TTF_CloseFont( font );
	TTF_Quit();
	SDL_Quit();
}

/*---------------------------------

Video::initVideo( void )
Initierar SDL:s ritfunktioner och annat.
Returnar: 0 vid OK, 1 vid fel

---------------------------------*/

bool Video::initVideo( void ) {

	return 0;
}

/*---------------------------------

Video::loadImage( const char* filnamn )
Laddar in en bild i minnet från en fil
Argument: filnamn = namnet på bildfilen, exklusive mappen
Returnerar: En SDL_Surface* med bilden

---------------------------------*/

SDL_Surface* Video::loadImage( const char* filnamn ) {
	char f[22];
	SDL_Surface *tmpbild, *bild;

	memcpy(f, "bild/", 5);
	memcpy(f+5, filnamn, strlen(filnamn)+1);
	tmpbild = SDL_LoadBMP(f);

	if( !tmpbild ){
		cerr << "Fatalt Fel (Video::loadImage): Bilden finns inte på det angivna filnamnet..." << endl;
		exit(1);
	}

	bild = SDL_DisplayFormat( tmpbild );
	SDL_FreeSurface( tmpbild );
	SDL_SetColorKey( bild, SDL_SRCCOLORKEY, SDL_MapRGB( bild->format, 0, 0, 0xff ) );

	return bild;
}

/*---------------------------------

void Video::renderText( const char* text, short x, short y, SDL_Color farg )
Visar text på skärmen
Argument: text = texten, x, y = koordinater att rita på, farg = färgen på texten

---------------------------------*/

void Video::renderText( const char* text, short x, short y, SDL_Color farg ) {
	SDL_Surface *text_surface;
	text_surface = TTF_RenderUTF8_Solid( video->font, text, farg );
	ritaBild( x, y, 0, 0, text_surface );
	SDL_FreeSurface( text_surface );
}

/*---------------------------------

bool Video::ritaBild( int x, int y, int w, int h, SDL_Surface* bild )
Ritar en bild. Kallas oftast från pjäsernas rita-funktion...
Argument: offsetrektangelns mått + bilden som ska blittas
Returnar: 0 vid OK, 1 vid fel (oftast bild saknas)

---------------------------------*/

bool Video::ritaBild( int x, int y, int w, int h, SDL_Surface* bild ) {
	if (!bild) {
		cerr << "Fatalt Fel (Video::ritaBild): Bild saknas" << endl;
		exit(1);
	}
	SDL_Rect rect = { x, y, w, h };
	SDL_BlitSurface( bild, NULL, screen, &rect );

	return 0;
}

/*---------------------------------

Video::ritaRektangel( int x, int y, int w, int h, Uint32 farg )
Ritar en rektangel.
Argument: rektangelns mått + dess färg

---------------------------------*/

void Video::ritaRektangel( int x, int y, int w, int h, Uint32 farg ) {

    SDL_Rect rect = { x, y, w, h };
    SDL_FillRect( screen, &rect, farg );

}

/*---------------------------------

Video::ritaOmAllt( void )
Ritar om hela skärmen, pjäser och allt

---------------------------------*/

void Video::ritaOmAllt( void ) {

	// Täck först fönstret med svart färg
	ritaRektangel( 0, 0, 640, 480, SVART_FARG );

    // Måla alla enskilda rutor
	for( int i = 0; i < 8; i++ ) {
		for( int j = 0; j < 8; j++ ){
			Uint32 farg = ( ((j%2)+(i%2)) % 2 ? 0 : VIT_FARG );
			ritaRektangel( i*60, j*60, 60, 60, farg );
		}
    }
    // Rita den vita kanten
	ritaRektangel(8*60, 0, 1, 480, VIT_FARG );

	// Om det finns en markerad pjäs, rita ljusblå bakgrund på dess ruta, och ljusgrå dit den kan gå
    if( game->markerad != NULL ) {
    	ritaRektangel( game->markerad->xpos*60, game->markerad->ypos*60, 60, 60, MARKERAD_FARG );

    	for( int i = 0; i < 8; i++ ) {
			for( int j = 0; j < 8; j++ ) {
				if( game->markerad->mojligaDrag[i][j] == 1 ) {
					ritaRektangel( i*60, j*60, 60, 60, GRA_FARG );

					// Passa även på att rita alla pjäser
					if( game->pjasArray[i][j] != NULL ) {
						ritaBild( i*60, j*60, 60, 60, game->pjasArray[i][j]->bild );
					}
				}
			}
		}
    }

    // Annars, rita bara alla pjäser.
	else {
		for( int i = 0; i < 8; i++ ) {
			for( int j = 0; j < 8; j++ ) {
				if( game->pjasArray[i][j] != NULL ) {
					ritaBild( i*60, j*60, 60, 60, game->pjasArray[i][j]->bild );
				}
			}
		}
	}

    /*Uint32 visaSpelare = ( (*runda)%2 ? vit_farg : 0 );
    SDL_Rect rectSpelare = {500, 400, 60, 60};
    SDL_FillRect( screen, &rectSpelare, visaSpelare );

    std::stringstream infoOmRunda;
    infoOmRunda << "Runda " << *runda;
    SDL_Surface* rundaText = TTF_RenderText_Solid( font, infoOmRunda.str().c_str(), vittext );
    SDL_Rect textrect = { 500, 20, 200, 200 };
    SDL_BlitSurface( rundaText, NULL, screen, &textrect );
    SDL_FreeSurface( rundaText );*/
}
